package co.gov.medellin.sdep.sisdep.integration.theta.dao;

import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.jdbc.object.MappingSqlQuery;

import co.gov.medellin.sdep.sisdep.common.OracleHelper;

/**
 * Clase DAO de consulta usado para la transferencia de informacion de las contravenciones
 * especificadas en el sistema THETA
 * 
 * @author carlos.perez@consult-soft.com 
 * @version 30-05-2012
 */
public class ThetaDAOImpl extends JdbcDaoSupport implements Serializable {

	private static final long serialVersionUID = 98756723627874847L;
	
	/**
	 * 
	 */
	public ThetaDAOImpl() {
	}

    //------------------------------------------------------------
    //--- Implementacion de DAO para Theta
    //------------------------------------------------------------

    private LoadContravencionesThetaList loadContravencionesThetaList;

	/**
	 * 
	 * Metodo que permite un listado de contravenciones asociadas a una persona en el
	 * sistema THETA, esto por medio del numero de cedula.
	 * @author carlos.perez@consult-soft.com  
	 * @version 30-05-2012 
	 * @param docID numero de cedula
	 */
	public List loadContravencionesThetaByDocID(String docID){
		return loadContravencionesThetaList.runQuery(docID);
	}
	
    /**
     * metodo de inicializacion de operaciones DAO
     */
    public void initDao() {
	   loadContravencionesThetaList = new LoadContravencionesThetaList(getDataSource());
    }
	    

    // --------------------------------------------------------------------
    // --- implementacion de la persistencia
    // --------------------------------------------------------------------
    // ------------- BaseQueryTheta --------------------------
    abstract class BaseQueryTheta extends MappingSqlQuery	{
	
		public BaseQueryTheta(DataSource ds,String sql) {
	   		super(ds,sql);
		}
		
		protected Object mapRow(ResultSet rs, int rownum) throws SQLException {
			ContravencionDTO contravDTO = new ContravencionDTO();
			contravDTO.setExpNuExpediente(rs.getString("EXP_NU_EXPEDIENTE"));
			contravDTO.setExpDtAlta(OracleHelper.date2string(rs.getDate("EXP_DT_ALTA")));      
			contravDTO.setExpDsCalle1(rs.getString("EXP_DS_CALLE1"));
			contravDTO.setExpDsCalle2(rs.getString("EXP_DS_CALLE2"));
			contravDTO.setExpNuCasa(rs.getString("EXP_NU_CASA"));
			contravDTO.setExpDsAdicional(rs.getString("EXP_DS_ADICIONAL"));
			contravDTO.setCasCdState(rs.getString("CAS_CD_STATE"));
			contravDTO.setRelNuDoc(rs.getString("REL_NU_DOC"));
			contravDTO.setRelDsApellido(rs.getString("REL_DS_APELLIDO"));
			contravDTO.setRelDsNombre(rs.getString("REL_DS_NOMBRE"));
			contravDTO.setD06DsDescripcion(rs.getString("D06_DS_DESCRIPCION"));
			contravDTO.setUsrDsApellido(rs.getString("USR_DS_APELLIDO"));
			contravDTO.setUsrDsNombre(rs.getString("USR_DS_NOMBRE"));
			contravDTO.setOunDsOrgUnit(rs.getString("OUN_DS_ORG_UNIT"));
			contravDTO.setT35DsAsunto(rs.getString("T35_DS_ASUNTO"));
			return contravDTO;
		}
    }
	   
	/**
	 * 
	 * Clase interna que permite ejecutar las consultas de contravenciones asociadas a una persona en el
	 * sistema THETA, esto por medio del numero de cedula.
	 * @author carlos.perez@consult-soft.com  
	 * @version 30-05-2012 
	 * @param docID numero de cedula
	 */
    class LoadContravencionesThetaList extends BaseQueryTheta {
    	private static final String SQL = 
			"SELECT EXPEDIENTES.NU_EXPEDIENTE AS EXP_NU_EXPEDIENTE, EXPEDIENTES.DT_ALTA AS EXP_DT_ALTA, " +
			"EXPEDIENTES.DS_CALLE1 AS EXP_DS_CALLE1, EXPEDIENTES.DS_CALLE2 AS EXP_DS_CALLE2, " + 
			"EXPEDIENTES.NU_CASA AS EXP_NU_CASA, EXPEDIENTES.DS_ADICIONAL AS EXP_DS_ADICIONAL, " + 
			"CASE.CD_STATE AS CAS_CD_STATE, RELATED_PERSON.NU_DOC AS REL_NU_DOC, " +
			"RELATED_PERSON.DS_NOMBRE AS REL_DS_NOMBRE, RELATED_PERSON.DS_APELLIDO AS REL_DS_APELLIDO, " +
			"D006.DS_DESCRIPCION AS D06_DS_DESCRIPCION, USUARIO.DS_APELLIDO AS USR_DS_APELLIDO, " + 
			"USUARIO.DS_NOMBRE AS USR_DS_NOMBRE, ORG_UNIT.DS_ORG_UNIT AS OUN_DS_ORG_UNIT, T035.DS_ASUNTO AS T35_DS_ASUNTO " +
			"FROM GPAAME.EXPEDIENTES@DBL_SISDEP_OBSE EXPEDIENTES, GPAAME.CASE@DBL_SISDEP_OBSE CASE, GPAAME.USUARIO@DBL_SISDEP_OBSE USUARIO, " + 
			"GPAAME.T035@DBL_SISDEP_OBSE T035, GPAAME.RELATED_PERSON@DBL_SISDEP_OBSE RELATED_PERSON, GPAAME.ORG_UNIT@DBL_SISDEP_OBSE ORG_UNIT, " + 
			"GPAAME.D006@DBL_SISDEP_OBSE D006 " +
			"WHERE ((EXPEDIENTES.NU_EXPEDIENTE = CASE.DOCUMENT_KEY_MAIN) AND " +
			"(EXPEDIENTES.CD_ASUNTO = T035.CD_ASUNTO) AND " +
			"(EXPEDIENTES.NU_EXPEDIENTE = RELATED_PERSON.DOCUMENT_KEY) AND " +
			"(EXPEDIENTES.CD_USUARIO_RESPONS = USUARIO.CD_USUARIO) AND " +
			"(EXPEDIENTES.CD_ORG_UNIT_ACTUAL = ORG_UNIT.CD_ORG_UNIT) AND " +
			"(EXPEDIENTES.TP_CALLE = D006.CD_CODIGO) AND (CASE.CD_STATE LIKE 'ACTIVE') AND " +
			"(RELATED_PERSON.NU_DOC = ?))";
			    	
    	public LoadContravencionesThetaList(DataSource ds) {
    		super(ds,SQL);
      		declareParameter(new SqlParameter(Types.CHAR) ); 
			compile();
    	}
    	    	
    	public List runQuery(String docID) {
			List result =  execute( new Object[]{new String(docID)});
			if ( result != null && result.size() > 0 ) {
        		return result;
        	} else {
        		return null;
        	}	
    	}
    }
	    
}
